package Leetcode;


/**
 * 删除链表中所有值为val的节点
 */
public class test203 {


    public ListNode removeElements(ListNode head, int val) {
        while(head!=null&&head.val==val){
            head=head.next;
        }
        if (head==null){
            return null;
        }else{
            ListNode prev=head;
            while (prev.next!=null){
                if (prev.next.val==val){
                    ListNode node=prev.next;
                    prev.next=node.next;

                }else{
                    prev=prev.next;
                }
            }return head;
        }
    }

    /**
     * 虚拟头节点删除链表中所有值为val的节点
     * @param head
     * @param val
     * @return
     */
    public ListNode removeElements1(ListNode head, int val) {
          ListNode dummyHead=new ListNode();
          dummyHead.next=head;
          ListNode prev=dummyHead;
          while(prev.next!=null){
              if (prev.next.val==val){
                  prev.next=prev.next.next;

              }else{
                  prev= prev.next;
              }

          }return dummyHead.next;
    }


    /**
     * 使用递归思路
     * @param head
     * @param val
     * @return
     */
    public ListNode removeElements2(ListNode head, int val) {
        if (head==null){
            return null;
        }
        //删除所有值为val的节点后，子链表的头节点可能会发生变化
        //此时需要更新第二个节点的引用
        head.next=removeElements2(head.next,val);
        if (head.val==val){
            return head.next;
        }
        return head;
    }
}


